# helper class for interactive object motion
#
# Copyright (C) 2007  "Peter Roesch" <Peter.Roesch@fh-augsburg.de>
#
# This code is licensed under the PyOpenGL License.
# Details are given in the file license.txt included in this distribution.

import sys

try:
  from OpenGL.GLUT import *
  from OpenGL.GL import *
  from OpenGL.GLU import *
except:
  print(''' Error: PyOpenGL not installed properly !!''')
  sys.exit(  )

class InteractionMatrix ( object ):
    """Class holding a matrix representing a rigid transformation.

    The current OpenGL is read into an internal variable and
    updated using rotations and translations given by
    user interaction."""

    def __init__( self ):
        self.__currentMatrix = None
        self.reset( )

    def reset( self ):
        """Initialise internal matrix with identity"""
        glPushMatrix( )
        glLoadIdentity( )
        self.__currentMatrix = glGetFloatv( GL_MODELVIEW_MATRIX )
        glPopMatrix( )

    def addTranslation( self, tx, ty, tz ):
        """Concatenate the internal matrix with a translation matrix"""
        glPushMatrix( )
        glLoadIdentity( )
        glTranslatef(tx, ty, tz)
        glMultMatrixf( self.__currentMatrix )
        self.__currentMatrix = glGetFloatv( GL_MODELVIEW_MATRIX )
        glPopMatrix( )

    def addRotation( self, ang, rx, ry, rz ):
        """Concatenate the internal matrix with a translation matrix"""
        glPushMatrix( )
        glLoadIdentity( )
        glRotatef(ang, rx, ry, rz)
        glMultMatrixf( self.__currentMatrix )
        self.__currentMatrix = glGetFloatv( GL_MODELVIEW_MATRIX )
        glPopMatrix( )

    def getCurrentMatrix( self ):
        return self.__currentMatrix

if __name__ == '__main__' :
    glutInit( sys.argv )
    glutCreateWindow( sys.argv[0] )
    m=InteractionMatrix()
    print(m.getCurrentMatrix( ))
    m.addTranslation(1,2,3)
    print(m.getCurrentMatrix( ))
    m.addRotation(30,0,0,1)
    print(m.getCurrentMatrix( ))
    m.addTranslation(1,2,3)
    print(m.getCurrentMatrix( ))
